/*
 * @Descripttion: 文件描述
 * @version: 文件版本
 * @Author: jinsc
 * @Date: 2022-04-10 17:23:10
 * @LastEditors: jinsc
 * @LastEditTime: 2022-05-17 21:45:20
 * @FilePath: \my_esp32_s3\components\sd_card\sd_card.h
 */
#ifndef SD_CARD_H
#define SD_CARD_H

#ifdef __cplusplus
extern "C" {
#endif

/*********************
 *      INCLUDES
 *********************/
/* C库 */
#include <sys/unistd.h>
#include <sys/stat.h>
#include <dirent.h>//目录操作
/* SDK库 */
#include "esp_vfs_fat.h"
/*********************
 *      DEFINES
 *********************/
#ifndef SD_MOUNT_POINT //SD卡挂载时使用的名称
#define SD_MOUNT_POINT "/sd"
#endif
#ifndef FT_MOUNT_POINT //SD卡挂载时FATFS使用的盘符
#define FT_MOUNT_POINT "0:"
#endif
#ifndef STORAGE_NAMESPACE //storage挂载时FATFS使用的盘符
#define STORAGE_NAMESPACE "storage"
#endif

#ifndef malloc_ram //在内部申请ram
    #ifdef CONFIG_ESP32S3_SPIRAM_SUPPORT //只有支持了spram才能使用
    #define malloc_ram(x) heap_caps_malloc((x), MALLOC_CAP_INTERNAL)
    #else
    #define malloc_ram(x) malloc((x))
    #endif
#endif

#ifndef malloc_pram //在外部申请ram
    #ifdef CONFIG_ESP32S3_SPIRAM_SUPPORT //只有支持了psram才能使用
    #define malloc_pram(x) heap_caps_malloc((x), MALLOC_CAP_SPIRAM)
    #else
    #define malloc_pram(x) malloc((x))
    #endif
#endif

#ifndef ft_open   //自定义 FATFS打开文件使用， ftopen(fd, path, FA_READ)
#define ft_open(fd, path, mode) (fd = malloc_pram(sizeof(FIL)), (f_open(fd, (path), mode)==0)?(0):(free(fd),-1) )//自带申请一个内存 并且打开失败时自动释放内存
#endif
#ifndef ft_close  //自定义 FATFS关闭文件使用，ftclose(fd)
#define ft_close(fd) (f_close(fd), free(fd) )//自带释放一个内存
#endif
/**********************
 *      TYPEDEFS
 **********************/

/**********************
 * GLOBAL PROTOTYPES
 **********************/
void init_Sdcard(void);
void mount_usb_sdcard( void );//该函数会启动一个线程
/**********************
 *      MACROS
 **********************/

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /*SD_CARD_H*/
